home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Shareware Extravaganza - Disc 1
/
ShareWare Extravaganza 1 of 4 (The Ultimate Shareware Company).iso
/
grprogs
/
picutil.exe
/
ALTER.SRC
/
MAIN.ASM
< prev
next >
Wrap
Assembly Source File
|
1986-10-16
|
14KB
|
329 lines
;╔═════════════════════════════════════════════════════════════════════════════╗
;║ ░░░░░░░░░░░ PROGRAM = MAIN.ASM ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
;╚═════════════════════════════════════════════════════════════════════════════╝
CSEG SEGMENT PUBLIC BYTE
ASSUME CS:CSEG,DS:CSEG
INCLUDE PUBLICS.EQU
INCLUDE STRUC.EQU
EXTRN BUFF_SIZE:WORD
EXTRN FILENAME:BYTE
EXTRN FILE_TYPE:WORD
EXTRN DISK_BUFFER:WORD
EXTRN FILE_SIZE:WORD
EXTRN FLAGS:WORD
EXTRN HANDLE_IN:WORD
EXTRN HANDLE_OUT:WORD
EXTRN HEIGHT_PIX:WORD
EXTRN PROG_END:WORD
EXTRN READ_PROG:WORD
EXTRN TYPE_FROM:WORD
EXTRN TYPE_TO:BYTE
EXTRN STACK:WORD
EXTRN WIDTH_BYTES:WORD
EXTRN WRITE_PROG:WORD
EXTRN BREAK_ON:NEAR
EXTRN BREAK_OFF:NEAR
TELL_HOW DB '┌─────────────────────────────────────────────────────────────┐',cr,lf
DB '│syntax = ALTER filename.typ typ[i] │',cr,lf
DB '├─────────────────────────────────────────────────────────────┤',cr,lf
DB '│filename.typ = name of picture file....must have correct type│',cr,lf
DB '│typ = what to convert file format to │',cr,lf
DB '│i = invert picture │',cr,lf
DB '├─────────────────────────────────────────────────────┬───┬───┤',cr,lf
DB '│the following types are valid: │IN │OUT│',cr,lf
DB '│ BAS = BSAVE FILE FORMAT │ Y │ N │',CR,LF
DB '│ CUT = DR. HALO II FORMAT │ Y │ Y │',CR,LF
DB '│ IMG = EFS IMAGE FILE │ Y │ Y │',CR,LF
DB '│ MSP = MICROSOFT PAINT FORMAT │ Y │ Y │',CR,LF
DB '│ PGA = PROFESSIONAL GRAPHICS DISPLAY FORMAT │ N │ Y │',CR,LF
DB '│ PIC = MOUSE SYSTEMS PCPAINT 1.50 FORMAT │ Y │ N │',CR,LF
DB '│ PIG = PIXEL IMAGE GENERATION (RICOH IS30 FORMAT) │ Y │ Y │',CR,LF
DB '│ RAS = SHOW FILE FORMAT │ Y │ N │',CR,LF
DB '│ 07/16/1986 │ │ │',CR,LF
DB '└─────────────────────────────────────────────────────┴───┴───┘',cr,lf
DB 7,'$'
OPEN_ERROR DB 'open error on input file',cr,lf,'$'
CREATE_ERROR DB 'create error on output file',cr,lf,'$'
TYPE_ERROR DB 'error in type of input file',cr,lf
Db 'must be BAS,CUT,FNT,IMG,MSP,PGA,PIC,PIG, or RAS',cr,lf,'$'
NOT_IMP DB 'NOT IMPLIMENTED YET',CR,LF,'$'
;╔═════════════════════════════════════════════════════════════════════════════╗
;║ ░░░░░░░░░░░ MAIN.ASM ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
;╚═════════════════════════════════════════════════════════════════════════════╝
MAIN PROC FAR
;┌─────────────────────────────────────────────────────────────────────────────┐
;│ RETURN SETUP │
;└─────────────────────────────────────────────────────────────────────────────┘
CLI
MOV AX,CS ;TEMP STACK
MOV SS,AX ;
MOV ES,AX ;
MOV SP,OFFSET STACK ;
STI
PUSH DS ;
XOR AX,AX ;
PUSH AX ;
;┌─────────────────────────────────────────────────────────────────────────────┐
;│ GET FILENAME FROM COMMAND LINE │
;└─────────────────────────────────────────────────────────────────────────────┘
MOV SI,82H ;START OF FILENAME
XOR CH,CH ;
MOV CL,DS:[SI-2] ;SIZE OF FILENAME
CMP CX,0 ;NO COMMANDS
JE GFN800 ;ERROR
MOV DI,OFFSET FILENAME ;STORE FILENAME HERE
GFN100:
LODSB ;GET CHARACTER
CMP AL,20H ;END OF FILENAME?
JE GFN700 ;YES....BRANCH
CMP AL,CR ;END OF COMMAND LINE?
JE GFN800 ;YES....ERROR
STOSB ;SAVE CHARACTER
CMP AL,'.' ;START OF TYPE
JNE GFN200 ;
MOV CS:TYPE_FROM,DI ;START OF TYPE
GFN200:
LOOP GFN100 ;GET ANOTHER CHARACTER
JMP SHORT GFN800 ;ERROR IF DONE ALREADY
GFN300:
LODSB ;GET CHARACTER
CMP AL,CR ;END OF COMMAND LINE?
JE GFN900 ;YES....ERROR
AND AL,0DFH ;CONVERT TO UPPER CASE
STOSB ;SAVE CHARACTER
LOOP GFN300 ;GET ANOTHER CHARACTER
JMP SHORT GFN800 ;ERROR IF DONE
GFN700: ;
MOV AL,0 ;
STOSB ;
MOV DI,OFFSET TYPE_TO ;
LOOP GFN300
GFN800:
MOV DX,OFFSET TELL_HOW ;
JMP ERROR ;
GFN900:
MOV AL,0 ;PUT NULL AT END OF STRING
STOSB ;
CMP WORD PTR CS:TYPE_FROM,0 ;
JE GFN800 ;ERROR
;┌─────────────────────────────────────────────────────────────────────────────┐
;│ TURN BREAK KEY ON │
;└─────────────────────────────────────────────────────────────────────────────┘
SET_BREAK:
MOV AX,CS ;SET DATA SEGMENT
MOV DS,AX ;
CALL BREAK_ON ;SET UP CONTROL BREAK
;┌─────────────────────────────────────────────────────────────────────────────┐
;│ FIND DISK MEMORY │
;└─────────────────────────────────────────────────────────────────────────────┘
MOV AX,OFFSET PROG_END ;
MOV BX,CS ;
SHR AX,1 ;
SHR AX,1 ;
SHR AX,1 ;
SHR AX,1 ;
ADD BX,AX ;
INC BX ;
MOV DISK_BUFFER+2,BX ;
;┌─────────────────────────────────────────────────────────────────────────────┐
;│ OPEN INPUT FILE │
;└─────────────────────────────────────────────────────────────────────────────┘
MOV AH,3DH ;OPEN FILE FOR READ
MOV AL,0H ;
MOV DX,OFFSET FILENAME ;
INT 21H ;
JNC OIF100
MOV DX,OFFSET OPEN_ERROR ;
JMP ERROR
OIF100:
MOV HANDLE_IN,AX
;┌─────────────────────────────────────────────────────────────────────────────┐
;│ GET FILETYPE │
;└─────────────────────────────────────────────────────────────────────────────┘
MOV DI,OFFSET FILE_TYPE
MOV SI,TYPE_FROM
AND BYTE PTR [SI],0DFH ;CONVERT TYPE TO UPPER CASE
AND BYTE PTR [SI+1],0DFH ;
AND BYTE PTR [SI+2],0DFH ;
GF050:
XOR BX,BX ;
CMP BYTE PTR [DI],0 ;END OF TABLE?
JNE GF075 ;NO..CONTINUE
MOV DX,OFFSET TYPE_ERROR ;YES....ERROR
JMP ERROR ;
GF075:
MOV CX,3 ;MUST FIND A MATCH OF 3 CHAR.
GF100:
MOV AL,[SI+BX] ;GET FILE TYPE
CMP AL,[DI+BX] ;COMPARE TO TABLE
JNE GF200 ;GO TO NEXT ENTRY
INC BX
LOOP GF100 ;MATCH...TRY AGAIN
JMP GF300 ;GOOD NAME...BRANCH
GF200:
ADD DI,13 ;GO TO NEXT ENTRY
JMP SHORT GF050 ;
GF300:
MOV SI,[DI.HEADER] ;GET LOCATION OF HEADER INFO
MOV CX,[SI] ;GET NUMBER OF BYTES IN HEADER
CMP CX,0
JE GF325
MOV DX,SI ;
ADD DX,2 ;GET PAST BYTES IN HEADER
MOV AH,3FH ;READ HEADER
MOV BX,HANDLE_IN ;
INT 21H ;
GF325:
MOV BX,[DI.DISK_IN] ;GET DISK INPUT PROGRAM
CMP BX,0 ;
JE GF350 ;
MOV READ_PROG,BX ;
MOV BX,[DI.INPUT] ;
CALL BX ;TRANSLATE INPUT HEADER
JNC GF400 ;
GF350:
MOV DX,OFFSET NOT_IMP ;
JMP ERROR ;
GF400:
;┌─────────────────────────────────────────────────────────────────────────────┐
;│ CHANGE FILENAME │
;└─────────────────────────────────────────────────────────────────────────────┘
MOV SI,OFFSET TYPE_TO ;CHANGE TYPE ON FILENAME
MOV DI,TYPE_FROM ;
MOV CX,3 ;
REP MOVSB ;
;┌─────────────────────────────────────────────────────────────────────────────┐
;│ CHECK FOR OPTIONS │
;└─────────────────────────────────────────────────────────────────────────────┘
OPT100:
LODSB
CMP AL,0 ;END OF OPTIONS?
JE OPT900 ;YES GO ON
AND AL,0DFH
CMP AL,'I' ;INVERT PIXEL DATA
JNE OPT100 ;
OR FLAGS,INVERT_OUT ;
OPT900:
;┌─────────────────────────────────────────────────────────────────────────────┐
;│ CREATE OUTPUT FILE │
;└─────────────────────────────────────────────────────────────────────────────┘
MOV AH,3CH ;
MOV CX,20H ;
MOV DX,OFFSET FILENAME ;
INT 21H ;
JNC COF100
MOV DX,OFFSET CREATE_ERROR ;
JMP ERROR
COF100:
MOV HANDLE_OUT,AX
;┌─────────────────────────────────────────────────────────────────────────────┐
;│ GET OUTPUT FILETYPE │
;└─────────────────────────────────────────────────────────────────────────────┘
MOV DI,OFFSET FILE_TYPE
MOV SI,OFFSET TYPE_TO
GOF050:
XOR BX,BX ;
CMP BYTE PTR [DI],0 ;END OF TABLE?
JNE GOF075 ;NO..CONTINUE
MOV DX,OFFSET TYPE_ERROR ;YES....ERROR
JMP ERROR ;
GOF075:
MOV CX,3 ;MUST FIND A MATCH OF 3 CHAR.
GOF100:
MOV AL,[SI+BX] ;GET FILE TYPE
CMP AL,[DI+BX] ;COMPARE TO TABLE
JNE GOF200 ;GO TO NEXT ENTRY
INC BX
LOOP GOF100 ;MATCH...TRY AGAIN
JMP GOF300 ;GOOD NAME...BRANCH
GOF200:
ADD DI,13 ;GO TO NEXT ENTRY
JMP SHORT GOF050 ;
GOF300:
MOV SI,[DI.HEADER] ;GET LOCATION OF HEADER INFO
MOV BX,[DI.DISK_OUT] ;GET DISK OUTPUT PROGRAM
CMP BX,0 ;
JE GOF350 ;
MOV WRITE_PROG,BX ;
MOV BX,[DI.OUTPUT] ;FIX UP OUTPUT HEADER
CALL BX ;
JNC GOF400 ;
GOF350:
MOV DX,OFFSET NOT_IMP ;
JMP ERROR ;
GOF400:
MOV CX,[SI] ;GET NUMBER OF BYTES IN HEADER
MOV DX,SI ;
ADD DX,2 ;GET PAST BYTES IN HEADER
MOV AH,40H ;WRITE HEADER
MOV BX,HANDLE_OUT ;
INT 21H ;
;┌─────────────────────────────────────────────────────────────────────────────┐
;│ FIND FILE SIZE │
;└─────────────────────────────────────────────────────────────────────────────┘
MOV AX,8000H ;SET BUFFER SIZE
XOR DX,DX
DIV WIDTH_BYTES ;AX = NUMBER IF LINES
MUL WIDTH_BYTES
MOV BUFF_SIZE,AX ;BUFFER SIZE
MOV AX,WIDTH_BYTES
MUL HEIGHT_PIX
MOV FILE_SIZE,AX
MOV FILE_SIZE+2,DX
;┌─────────────────────────────────────────────────────────────────────────────┐
;│ MOVE PICTURE DATA BETWEEN FILES │
;└─────────────────────────────────────────────────────────────────────────────┘
MP100:
CALL [READ_PROG] ;
PUSHF ;
; SUB FILE_SIZE,AX ;
; JNC MP175 ;
; DEC FILE_SIZE+2 ;
; CMP FILE_SIZE+2,0
; JNE MP175 ;
; ADD FILE_SIZE,AX ;
; MOV AX,FILE_SIZE ;
MP175:
push dx
push ax
mov ah,2
mov dl,'.'
int 21h
pop ax
pop dx
CALL [WRITE_PROG] ;
JNC MP200 ;
POPF ;WRITE PROGRAM ABORTING
JMP SHORT MP300 ;
MP200: ;
POPF ;
JNC MP100 ;
MP300: ;
;┌─────────────────────────────────────────────────────────────────────────────┐
;│ CLOSE FILES │
;└─────────────────────────────────────────────────────────────────────────────┘
MOV BX,HANDLE_IN ;CLOSE FILE
MOV AH,3EH ;
INT 21H ;
MOV BX,HANDLE_OUT ;CLOSE FILE
MOV AH,3EH ;
INT 21H ;
JMP EXIT
ERROR:
MOV AX,CS
MOV DS,AX
MOV AH,9
INT 21H
EXIT:
CALL BREAK_OFF ;BREAK KEY RESET
RET ;
MAIN ENDP
CSEG ENDS
END MAIN